import path from "path";
import { defineConfig, type ProxyOptions } from "vite";
import vue from "@vitejs/plugin-vue";
import config from "./src/utils/config";
import viteCompression from 'vite-plugin-compression';
import externalGlobals from 'rollup-plugin-external-globals';

/** 是否是打包 */
const isBuild = process.argv.includes('build');

/**
 * 获取代理信息
 * @param path 指定代理地址，默认测试环境
 */
function getProxyInfo(path = "") {
  return {
    target: path || config.proxyTargetUrl,
    changeOrigin: true,
    rewrite: (path) => path.replace(/^\/api/, ""),
  } as ProxyOptions;
}

/** [详细配置](https://vitejs.dev/config/) */
export default defineConfig(({ mode }) => {
  return {
    base: "/admin/", // 资源引入路径
    plugins: [
      ...(isBuild ? [
        /**
         * 注入外部依赖
         */
        {
          name: 'html-transform',
          transformIndexHtml(html) {
            return html
              // .replace('<!-- inject_on_build：vue -->', `<script src="/admin/_vue.3.2.47.runtime.global.prod.js"></script>`)
              // .replace('<!-- inject_on_build：vue-router -->', `<script src="/admin/_vue-router.4.1.6.global.prod.js"></script>`)
              // .replace('<!-- inject_on_build：micro-app -->', `<script src="/admin/_micro-app.1.0.0.rc.5.min.js"></script>`)
              // .replace('<!-- inject_on_build：element-plus -->', `<script src="/admin/element-plus.2.2.20.full.min.js" global></script>`)
          }
        },
      ]: []),
      vue({
        template: {
          compilerOptions: {
            // 将micro-app-前缀的标签名都视为自定义元素
            isCustomElement: (tag) => tag.startsWith('micro-app')
          }
        }
      }),
      viteCompression({
        algorithm: 'gzip', /** 压缩算法 */
        ext: '.gz', /** 生成的文件后缀 */
        threshold: 1024*20, /** 对超过10k的数据压缩 */
        verbose: false, /** 禁止在控制台输出压缩结果 */
        filter: /\.(js|mjs|json|css|html)$/i, /** 对这些文件进行压缩 */
        deleteOriginFile: false /** 是否删除原文件 */
      })
    ],
    resolve: {
      alias: {
        "@": path.resolve(__dirname, "src"),
        // 'vue': "https://esm.sh/vue@3.2.37?dev",
      },
    },
    server: {
      port: config.devPort,
      host: "0.0.0.0",
      cors: true,
      proxy: {
        "/api": getProxyInfo(),
      },
    },
    headers: {
      "Access-Control-Allow-Origin": "*",
    },
    build: {
      /** 配置资源打包目录 */
      assetsDir: './js',
      /** 分包后警告大小（未压缩大小） */
      chunkSizeWarningLimit: 1000,
      /** css不抽离为单独文件 */
      cssCodeSplit: false,
      rollupOptions: {
        plugins: [
          /** 不打包这些依赖 */
          // externalGlobals({
          //   'vue': 'Vue',
          //   'vue-router': 'VueRouter',
          //   'element-plus': 'ElementPlus',
          //   '@micro-zoe/micro-app': 'microApp',
          // }),
        ],
        external: ['vue', 'vue-router', 'element-plus', '@micro-zoe/micro-app'],
        output: {
          /** 分包 */
          manualChunks: {
            // 'micro-app': ['@micro-zoe/micro-app'],
            // 'vue': ['vue'],
            // 'vue-router': ['vue-router'],
            // 'element-plus': ['element-plus']
          },
          /** 入口文件输出格式 */
          entryFileNames: 'js/[name].[hash]_h.js',
          /** js文件输出格式 */
          chunkFileNames: 'js/[name].[hash]_h.js',
          /** 资源文件输出格式 */
          assetFileNames: (assetInfo) => {
            /** 默认输出格式 */
            const defaultFormat = '[ext]/[name].[hash]_h.[ext]';
            /** 图片后缀 */
            const imageExts = ['png', 'jpg', 'jpeg', 'webp', 'gif', 'svg', 'ico'];
            /** 字体后缀 */
            const fontExts = ['ttf', 'woff', 'woff2'];
            /** 当前文件后缀 */
            const fileExt = assetInfo.name?.split('.').slice(-1)[0];
            /** 提取文件后缀异常处理 */
            if (!fileExt) {
              console.warn('>>> 文件后缀异常: ', assetInfo);
              return defaultFormat;
            }
            /** 图片资源 */
            if (imageExts.includes(fileExt)) {
              return 'img/[name].[hash]_h.[ext]';
            } else if (fontExts.includes(fileExt)) {
              return 'font/[name].[hash]_h.[ext]';
            }
            /** 其它资源 */
            return defaultFormat;
          },
        }
      }
    }
  };
});
